package boot

import (
	"fmt"
	"os"
	"path/filepath"

	"yunj/pkg/global"
	"yunj/pkg/html"
	"yunj/pkg/yunj/app/middleware"
	yunjRouter "yunj/pkg/yunj/router"
	"yunj/router"

	"github.com/gin-gonic/gin"
)

// 初始化路由
func InitRoute() {
	gin.SetMode(global.Config.App.Mode)
	r := gin.Default()
	// 中间件
	r.Use(
		middleware.CORS(),
	)
	// 模板引擎
	r.HTMLRender = html.NewRender("resource/view/", "pkg/yunj/resource/view/")
	// 静态路由
	r.Static("/yunj/static", "./pkg/yunj/resource/static")
	r.Static("/static", "./resource/static")
	r.Static("/upload", "./storage/upload")
	r.StaticFile("/favicon.ico", "./resource/static/favicon.ico")

	// 后台路由
	yunjRouter.AdminRouter(r)
	// 初始化其他路由
	router.InitRouter(r)

	// 创建软连接
	err := createPageSymlink()
	if err != nil {
		panic(fmt.Sprintf("page.html文件软连接创建失败！%v", err))
	}

	global.GinEngine = r
}

// 将：pkg/yunj/resource/view/admin/page.html 复制/覆盖到：resource/view/admin/page.html
func createPageSymlink() error {
	errPrefix := "创建page.html软连接"
	rootDir, err := os.Getwd()
	if err != nil {
		return fmt.Errorf("%s：获取当前工作目录失败: %v", errPrefix, err)
	}
	// 定义目标路径和链接路径
	targetPath := filepath.Join(rootDir, "pkg", "yunj", "resource", "view", "admin", "page.html")
	linkPath := filepath.Join(rootDir, "resource", "view", "admin", "page.html")

	// 判断是否要创建软连接
	isCreate, err := isCreatePageSymlink(linkPath, targetPath)
	if err != nil {
		return fmt.Errorf("%s：%v", errPrefix, err)
	}
	if !isCreate {
		return nil
	}

	// 创建软链接
	err = os.Symlink(targetPath, linkPath)
	if err != nil {
		return fmt.Errorf("%s：创建软链接失败: %v", errPrefix, err)
	}

	// 可选：验证软链接是否创建成功
	linkInfo, err := os.Readlink(linkPath)
	if err != nil {
		return err
	}
	if linkInfo == targetPath {
		println("软链接创建成功")
	} else {
		println("软链接创建失败，指向的路径不符合预期")
	}
	return nil
}

// 判断是否创建软连接
// linkPath 链接路径
// targetPath 链接指向的路径
func isCreatePageSymlink(linkPath, targetPath string) (bool, error) {
	// 判断链接文件是否存在
	if _, err := os.Stat(linkPath); err != nil {
		return true, nil
	}
	// 读取软链接的目标路径
	linkTarget, err := os.Readlink(linkPath)
	if err != nil {
		// 如果不是软链接，或者路径不存在
		err = os.Remove(linkPath)
		if err != nil {
			return false, fmt.Errorf("软连接文件删除失败！%v", err)
		}
		return true, nil
	}

	// 比较读取到的目标路径与预期路径
	if filepath.Clean(linkTarget) != filepath.Clean(targetPath) {
		err = os.Remove(linkPath)
		if err != nil {
			return false, fmt.Errorf("软连接删除失败！%v", err)
		}
		return true, nil
	}
	return false, nil
}
